import {BaseDataModel} from "./BaseDataModel.js";

/**
 * @description 队列数据类型封装
 * @class {BaseQueueModel}
 * @extends {BaseDataModel}
 * @author hhx
 * @date 2024-11-13 15:11
 * @version 0.1.2
 */
export class BaseQueueModel extends BaseDataModel {

    /**
     * @description 存放队列
     * @private
     * @type {Array} 队列
     */
    _queue = null;

    /**
     * @description 队列构造函数
     * @public
     * @constructor
     */
    constructor() {

        super();

        this.queue = [];
    }

    //========================== 内部属性 ==========================

    /**
     * @description 获取 队列
     * @property
     * @protected
     * @return {Array} 队列
     */
    get queue() {
        return this._queue;
    }

    /**
     * @description 设置 队列
     * @property
     * @protected
     * @param value {*} 队列值
     */
    set queue(value) {
        this._queue = value;
    }

    //========================== 属性方法 ==========================

    /**
     * @description 设置队列值
     * @public
     * @return {Array} 队列
     */
    getQueue() {
        return this.queue;
    }

    /**
     * @description 设置队列值
     * @public
     * @param value {*} 设置入队值
     */
    setQueue(value) {
        this.queue = value;
    }

    //========================== 接口 ==========================

    /**
     * @description 入队
     * @public
     * @param value {*} 入队值
     */
    enqueue(value) {
        this.queue.push(value);
    }

    /**
     * @description 出队
     * @public
     */
    dequeue() {
        this.queue.shift();
    }

    //========================== 重载方法 ==========================

    /**
     * @description 重写方法
     * @protected
     * @override
     */
    isEmpty() {
        return this.queue.length === 0;
    }

    /**
     * @description 重写方法
     * @protected
     * @override
     */
    size() {
        return this.queue.length;
    }
}